#include <shell/shell.h>
#include <shell/cmd_planif.h>
#include <shell/teclado.h>
#include <shell/sys_video.h>
#include <kernel/libk/libk.h>
#include <kernel/libk/string.h>

#include <kernel/system.h>
#include <kernel/sched.h>

/******************************************************************************
Funciónes: void vFnMenuPlanif()
Descripción:  cambian de algoritmos de planificacion, muestra los valores 
			 para el algoritmo elegido, establece parametros por defecto

Recibe:   iArg2 opcion elegida; iArg1 depende de iArg2. Planificador a cambiar
					o direccion de comienzo de [variable]=[valor]
Devuelve: nada

Fecha última modificación: 09/09/2007
******************************************************************************/

void vFnMenuPlanif(int iArg1,int iArg2)
{
	if(iArg2 == 1)
	{
		vFnImprimir("\nTODO planif aplicar");
		return;
	}
	if(iArg2 == 2)
	{
		if(iArg1 == 1) lFnSysSchedSetScheduler(RR);
		if(iArg1 == 2) lFnSysSchedSetScheduler(BTS);
		if(iArg1 == 3) lFnSysSchedSetScheduler(FIFO);
		return;
	}
	if(iArg2 == 3)
	{
		lFnSysSchedSetScheduler(RR);
		return;
	}
	if(iArg2 == 4)
	{
		long planificador=lFnSysSchedGetScheduler();
		switch(planificador){
			case RR: vFnImprimir("\nestas en RR");
				 break;			
			case FIFO: vFnImprimir("\nestas en FIFO");
				 break;
			case BTS: vFnImprimir("\nestas en BTS");
				 break;
			default: vFnImprimir("\nquien sabe que algoritmo es este...");
		}
		return;
	}
	if(iArg2 == 5)
	{
		char strPar[32];
		int k;
		for(k=0;k<32;k++)
		{
			strPar[k]=*(char*)iArg1;
			iArg1++;
		}
		char strVariable[32+1];
		char strValor[32+1];
    		int i=0;

	        while( (strPar[i] != '=') && (strPar[i] != '\0') ) {
            		strVariable[i] = strPar[i];
            		i++;
        	}
		strVariable[i]='\0';

		if(strPar[i]=='\0' || strPar[++i]=='\0' || strPar[0]=='=') {
            		vFnImprimir("\nParametros incorrectos, tipee [planif] para mas informacion");
		}
		else {
			int j=i;
            		while( strPar[i] != '\0' ) {
                		strValor[i-j] = strPar[i];
                		i++;
			}			
			strValor[i-j]='\0';
			
			vFnImprimir("\nVariable: %s Valor: %s",strVariable,strValor);
			
			if(iFnCompararCadenas(strVariable,"quantum")==1){
				
				lFnSysSchedSetParam(iFnCtoi(strValor));
				vFnImprimir("\n quantum= %d", uliQuantum);
			}

		}
		
		return;
	}
}


/******************************************************************************
Funciónes: Subcomandos del planificador
Descripción:  cambian de algoritmos de planificacion, muestra los valores 
			 para el algoritmo elegido, establece parametros por defecto

Recibe:   posicion de comienzo del comando en el buffer del shell
Devuelve: nada

Fecha última modificación: 09/09/2007
******************************************************************************/

void vFnSubCmdPlanifAplicar(){
	vFnImprimir("\nTODO planif aplicar");
}


void vFnSubCmdPlanifCambiar(int iComandoPos){
	char strPar[16];
	if(iFnGetArg (iComandoPos, 2, strPar, sizeof(strPar)) == 1){
		if(iFnCompararCadenas(strPar,"RR")==1){
			lFnSysSchedSetScheduler(RR);
		}else if(iFnCompararCadenas(strPar,"BTS")==1){
			lFnSysSchedSetScheduler(BTS);
		}else if(iFnCompararCadenas(strPar,"FIFO")==1){
			lFnSysSchedSetScheduler(FIFO);
		}else{
			vFnImprimir("\nEse algoritmo no existe (en el sodium quizas)");
		}
		
	}
	else{
		vFnImprimir("\nIngrese el nombre del algoritmo a cambiar!!");
	}
}


void vFnSubCmdPlanifDefecto(){
	lFnSysSchedSetScheduler(RR);
}


void vFnSubCmdPlanifMostrar(){
	long planificador=lFnSysSchedGetScheduler();
	switch(planificador){
		case RR: vFnImprimir("\nestas en RR");
				 break;			
		case FIFO: vFnImprimir("\nestas en FIFO");
				 break;
		case BTS: vFnImprimir("\nestas en BTS");
				 break;
		default: vFnImprimir("\nquien sabe que algoritmo es este...");
	}
}


void vFnSubCmdPlanifSet(int iComandoPos){
	char strPar[32];
	char strVariable[32+1];
	char strValor[32+1];
    int i;

	if(iFnGetArg (iComandoPos, 2, strPar, sizeof(strPar)) == 1){
        i = 0;
        while( (strPar[i] != '=') && (strPar[i] != '\0') ) {
            strVariable[i] = strPar[i];
            i++;
        }
		strVariable[i]='\0';
        
        /* Si tiene formato [planif set variable] o [planif set variable=],
         * entonces falta el valor de la variable; informamos por pantalla.
         */
        /* NOTA: al evaluar la segunda condicion, el '++i' deja incrementado el
         * valor de i; si se ejecuta la clausula ELSE, 'i' ya apunta al primer
         * caracter despues del '='.
         */
		if(strPar[i]=='\0' || strPar[++i]=='\0' || strPar[0]=='='){
            vFnImprimir("\nParametros incorrectos, "
                        "tipee [planif] para mas informacion");
		}
		else{
			int j=i;
            while( strPar[i] != '\0' ) {
                strValor[i-j] = strPar[i];
                i++;
			}			
			strValor[i-j]='\0';
			
			vFnImprimir("\nVariable: %s Valor: %s",strVariable,strValor);
			
			if(iFnCompararCadenas(strVariable,"quantum")==1){
				
				lFnSysSchedSetParam(iFnCtoi(strValor));
				vFnImprimir("\n quantum= %d", uliQuantum);

			}
			
		}
		
	}
	else{
		vFnImprimir("\nIngrese el nombre de la variable y del valor correspondiente!!");
	}
}
